package com.qk.management.task.clear;

import cn.hutool.core.collection.CollUtil;
import com.aliyuncs.exceptions.ClientException;
import com.qk.common.util.AliYunOSSOperators;
import com.qk.management.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

/**
 * 定时清理任务配置类
 * 该类实现了SchedulingConfigurer接口，用于配置定时任务，
 * 按固定延迟时间周期性执行清理操作
 */
@Slf4j
@Component
public class TimdClear implements SchedulingConfigurer {

    @Autowired
    private AliYunOSSOperators aliYunOSSOperators;

    @Autowired
    private UserMapper userMapper;


    /**
     * 配置定时任务
     *
     * @param taskRegistrar 定时任务注册器，用于注册和管理定时任务
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 添加固定延迟时间的任务，每隔指定时间间隔执行一次clear方法
        long interval = 1000 * 60;
        taskRegistrar.addFixedDelayTask(this::clear, interval);
    }

    /**
     * 执行清理操作的方法
     * 该方法会被定时调度执行，用于执行具体的清理逻辑
     */
    public void clear() {


        try {
            //获取阿里云OSS的桶里的所有文件名
            List<String> names = aliYunOSSOperators.getNames();
            //通过名字列表拼接获取文件的url集合
            List<String> urls = aliYunOSSOperators.getUrls(names);

            //如果从阿里云OSS中获取的url集合为空，则返回
            if (Optional.of(urls).isEmpty()) {
                log.info(LocalDate.now() + " 桶中还未添加数据");
                return;
            }

            //获取数据库中所有头像的url集合
            List<String> dbUrls = userMapper.selectAvatarUrls(LocalDate.now());

            //获取所有不在数据库中的url
            List<String> subUrls = (List<String>) CollUtil.subtract(urls, dbUrls);
//通过url删除阿里云OSS中的文件
            log.info("删除垃圾文件集合:{}", subUrls);

// 只有当存在需要删除的文件时才执行删除操作
            if (!subUrls.isEmpty()) {
                try {
                    aliYunOSSOperators.deleteFiles(subUrls);
                } catch (Exception e) {
                    log.error("删除垃圾文件失败", e);
                    throw new RuntimeException(e);
                }
            } else {
                log.info("没有需要删除的垃圾文件");
            }


        } catch (ClientException e) {
            throw new RuntimeException(e);
        }

    }
}


